var express = require('express');
var router = express.Router();
const {
    User
} = require('../../models');
const {
    Op
} = require('sequelize');
const { success, error, notFound, created, formatPagination } = require('../../utils/response');
const { filterBody, getPaginationParams } = require('../../utils/filter');
/* GET home page. */
// 获取用户列表
/**
 * @api {get} /admin/users 获取用户列表
 * @apiGroup Users
 * @apiVersion 1.0.0
 * @apiDescription 获取用户列表
 * @apiPermission 后台管理员
 * 
 */
router.get('/', async function (req, res, next) {
    try {
        const { currentPage, pageSize, offset } = getPaginationParams(req.query);
        const conditions = {
            order: [
                ['id', 'DESC']
            ],
            limit: pageSize,
            offset,
            attributes: { exclude: ['password'] }  // 排除密码字段
        };
        // 合并所有查询条件
        const where = {};
        if (req.query.email) {
            where.email = { [Op.eq]: req.query.email };
        }
        if (req.query.username) {
            where.username = { [Op.eq]: req.query.username };
        }
        if (req.query.nickname) {
            where.nickname = { [Op.like]: `%${req.query.nickname}%` };
        }
        if (req.query.role) {
            where.role = { [Op.eq]: req.query.role };
        }
        if (Object.keys(where).length > 0) {
            conditions.where = where;
        }
        const {
            rows,
            count
        } = await User.findAndCountAll(conditions);
        res.json(success(formatPagination(rows, count, currentPage, pageSize), '查询成功'));
    } catch (err) {
        res.status(500).json(error('查询失败'));
    }
});
// 查询用户详情
/**
 * @api {get} /admin/users/:id 查询用户详情
 * @apiGroup Users
 * @apiVersion 1.0.0
 */
router.get('/:id', async function (req, res, next) {
    try {
        const {
            id
        } = req.params;
        const user = await User.findByPk(id, {
            attributes: { exclude: ['password'] }  // 排除密码字段
        });
        if (!user) {
            return res.status(404).json(notFound('用户'));
        }
        res.json(success(user, '查询成功'));
    } catch (err) {
        res.status(500).json(error('查询失败', 500, err.message));
    }
});

// 创建用户
/**
 * @api {post} /admin/users/save 创建用户
 * @apiGroup Users
 * @apiVersion 1.0.0
 * @apiDescription 创建新用户
 * 
 * @apiParam {String} email 用户邮箱
 * @apiParam {String} username 用户名
 * @apiParam {String} password 密码
 * @apiParam {String} nickname 昵称
 * @apiParam {Number} [sex=0] 性别(0:未知,1:男,2:女)
 * @apiParam {String} [company] 公司
 * @apiParam {String} [introduce] 介绍
 * @apiParam {Number} [role=0] 角色(0:普通用户,100:管理员)
 * @apiParam {String} [avatar] 头像URL
 * 
 * @apiSuccess {Object} data 用户信息
 * @apiSuccess {Number} data.id 用户ID
 * @apiSuccess {String} data.email 用户邮箱
 * @apiSuccess {String} data.username 用户名
 * @apiSuccess {String} data.nickname 昵称
 * @apiSuccess {Number} data.sex 性别
 * @apiSuccess {String} data.company 公司
 * @apiSuccess {String} data.introduce 介绍
 * @apiSuccess {Number} data.role 角色
 * @apiSuccess {String} data.avatar 头像URL
 * @apiSuccess {String} data.createdAt 创建时间
 * @apiSuccess {String} data.updatedAt 更新时间
 */
router.post('/save', async function (req, res, next) {
    try {
        const body = filterBody(req.body, 'User');
        const user = await User.create(body);
        
        // 构造符合接口定义的响应数据
        const userData = user.toJSON();
        delete userData.password;  // 移除敏感信息

        // 使用 created 方法并设置正确的状态码
        res.status(201).json(created(userData));
    } catch (err) {
        if (err.name === 'SequelizeValidationError') {
            const errors = err.errors.map(e => e.message);
            return res.status(400).json(error('创建失败', 400, errors));
        }
        if (err.name === 'SequelizeUniqueConstraintError') {
            const errors = err.errors.map(e => e.message);
            return res.status(400).json(error('创建失败：数据已存在', 400, errors));
        }
        res.status(500).json(error('创建失败'));
    }
});

//删除用户
/**
 * @api {delete} /admin/users/:id 删除用户
 * @apiGroup Users
 * @apiVersion 1.0.0
 */
router.delete('/:id', async function (req, res, next) {
    try {
        const {
            id
        } = req.params;
        const user = await User.findByPk(id);
        if (!user) {
            return res.status(404).json(notFound('用户'));
        }
        await user.destroy();
        res.json(success({}, '删除成功'));  // 确保返回空对象而不是 null
    } catch (err) {
        res.status(500).json(error('删除失败'));
    }
});

// 更新用户
/**
 * @api {post} /admin/users/update 更新用户
 * @apiGroup Users
 * @apiVersion 1.0.0
 * 
 */
router.post('/update', async function (req, res, next) {
    try {
        const {
            id
        } = req.body;
        const user = await User.findByPk(id);
        if (!user) {
            return res.status(404).json(notFound('用户'));
        }
        const updateData = filterBody(req.body, 'User');
        await user.update(updateData);
        // 移除密码字段
        const userData = user.toJSON();
        delete userData.password;
        res.json(success(userData, '更新成功'));
    } catch (err) {
        if (err.name === 'SequelizeValidationError') {
            const errors = err.errors.map(e => e.message);
            return res.status(400).json(error('更新失败', 400, errors));
        }
        res.status(500).json(error('更新失败'));
    }
});

module.exports = router;